﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;

namespace SuperStar.Models
{
     [MetadataType(typeof(ProductMetaData))]
     public partial class Product
     {
        protected class ProductMetaData
        {
            public String Name { get; set; }
            [Required(ErrorMessage = "Giá sản phẩm không hợp lệ")]
            public String Price { get; set; }
            [Required(ErrorMessage = "Số lượng còn lại không hợp lệ")]
            public String RemainAmount { get; set; }
            [Required(ErrorMessage = "Số lượng không hợp lệ")]
            public String Quantity { get; set; }
            [Required(ErrorMessage = "Loại sản phẩm không hợp lệ")]
            public String ProductType_Id { get; set; }
            [Required(ErrorMessage = "Ảnh sản phẩm không hợp lệ")]
            public String Image { get; set; }
            [Required(ErrorMessage = "Điểm thưởng phẩm không hợp lệ")]
            public String GiftPoint { get; set; }
            [Required(ErrorMessage = "Ngày bắt đầu bán không hợp lệ")]
            public String StartSaleDate { get; set; }
            [Required(ErrorMessage = "Ngày kết thúc bán không hợp lệ")]
            public String EndSaleDate { get; set; }
            [Required(ErrorMessage = "Ngày bắt đầu nhận sản phẩm không hợp lệ")]
            public String StartReceiveDate { get; set; }
            [Required(ErrorMessage = "Ngày kết thúc nhận sản phẩm không hợp lệ")]
            public String EndReceiveDate { get; set; }
            [AllowHtml]
            public String Intro { get; set; }
            [AllowHtml]
            public String Contents { get; set; }
        }

        public Product()
        {
            DateAdded = new DateTime();
        }
     }
    public class ProductModels
    {
        public SuperStarEntities DB { get; set; }
        public String DEBUGTYPE { get; set; }

        public ProductModels()
        {
               DB = new SuperStarEntities();
        }
        public int GetCountAllProducts()
        {
            return DB.Products.Count();
        }
        public List<Product> GetAllProducts(int startIndex, int count, String sorting)
        {
            IEnumerable<Product> query = DB.Products;
            //Sorting
            //This ugly code is used just for demonstration.
            //Normally, Incoming sorting text can be directly appended to an SQL query.
            if (string.IsNullOrEmpty(sorting) || sorting.Equals("DateAdded DESC"))
            {
                query = query.OrderByDescending(p => p.DateAdded);
            }
            else if (sorting.Equals("Name DESC"))
            {
                query = query.OrderByDescending(p => p.Name);
            }
            else
            {
                query = query.OrderByDescending(p => p.DateAdded); //Default!
            }

            return count > 0
                           ? query.Skip(startIndex).Take(count).ToList() //Paging
                           : query.ToList(); //No paging
        }
        public bool UpdateProduct(Product p)
        {
            if (DEBUGTYPE.Equals("8_error"))
            {
                return DB.spTH08_Product_error_Product_Update(p.Id, p.Name, p.Price,
                                       p.Quantity, p.ProductType_Id, p.Intro,
                                       p.Contents, p.Image, p.GiftPoint, p.StartSaleDate, p.EndSaleDate,
                                       p.StartReceiveDate, p.EndReceiveDate) > 0;
            }
            if (DEBUGTYPE.Equals("8_fix"))
            {
                return DB.spTH08_Product_fix_Product_Update(p.Id, p.Name, p.Price,
                                       p.Quantity, p.ProductType_Id, p.Intro,
                                       p.Contents, p.Image, p.GiftPoint, p.StartSaleDate, p.EndSaleDate,
                                       p.StartReceiveDate, p.EndReceiveDate) > 0;
            }
            return DB.spProduct_Update(p.Id, p.Name, p.Price,
                                       p.Quantity, p.ProductType_Id, p.Intro,
                                       p.Contents, p.Image, p.GiftPoint, p.StartSaleDate, p.EndSaleDate,
                                       p.StartReceiveDate, p.EndReceiveDate) > 0;
        }
        public Product InsertProduct(Product pd)
        {
             return DB.spProduct_Insert(pd.Name, pd.Price, pd.RemainAmount,
                                     pd.Quantity, pd.ProductType_Id, pd.Intro,
                                     pd.Contents, pd.Image, pd.GiftPoint, DateTime.Now,
                                     pd.StartSaleDate, pd.EndSaleDate,
                                     pd.StartReceiveDate, pd.EndReceiveDate).First();
        }
        public bool DeleteProduct(int productId)
        {
            return DB.spProducts_Delete(productId) > 0;
        }
        public List<Product> GetNewProducts()
        {
            return DB.spProduct_GetNewProducts(10).ToList();
        } 
        public List<Product> GetHotProducts()
        {
            return DB.spProduct_GetHotProducts(10).ToList();
        }
        
        public Product GetProductDetail(int id)
        {
            var product = from p in DB.Products
                          where p.Id.Equals(id)
                          select p;
            return product.First();
        }
    }
}
